#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

// 定义锁
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

// 全局变量，存储总的余票
int ticketAmount = 2;

// 线程函数
void* ticketAgent(void* arg) {

	// 临界区前上锁
	pthread_mutex_lock(&mutex);
	
	// 记录总票数
	int amount = ticketAmount;
	
	sleep(1);
	
	if (amount > 0) {
		// 存在余票
		printf("One ticked sold!\n");
		amount--;
	} else {
		// 余票不足
		printf("Ticked sold out!\n");
	}
	
	// 更新总的余票
	ticketAmount = amount;

	// 临界区后解锁
	// 注意：如果没有及时 unlock ，那么该进程会陷入等待
	pthread_mutex_unlock(&mutex);

	pthread_exit(0);
}

int main() {

	pthread_t ticket_tid[2];
	
	for (int i = 0; i < 2; i++) {
		pthread_create(ticket_tid + i, NULL, ticketAgent, NULL);
	}
	
	// 等待子线程执行结束
	for (int i = 0; i < 2; i++) {
		pthread_join(ticket_tid[i], NULL);
	}
	
	printf("The left ticket is %d\n", ticketAmount);

	return 0;
}
